1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import com.google.common.annotations.Beta;
20 import com.google.common.annotations.GwtCompatible;
21
22 import java.io.Serializable;
23 import java.math.BigInteger;
24 import java.util.NoSuchElementException;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 @GwtCompatible
45 @Beta
46 public abstract class DiscreteDomain<C extends Comparable> {
47
48
49
50
51
52
53 public static DiscreteDomain<Integer> integers() {
54 return IntegerDomain.INSTANCE;
55 }
56
57 private static final class IntegerDomain extends DiscreteDomain<Integer>
58 implements Serializable {
59 private static final IntegerDomain INSTANCE = new IntegerDomain();
60
61 @Override public Integer next(Integer value) {
62 int i = value;
63 return (i == Integer.MAX_VALUE) ? null : i + 1;
64 }
65
66 @Override public Integer previous(Integer value) {
67 int i = value;
68 return (i == Integer.MIN_VALUE) ? null : i - 1;
69 }
70
71 @Override public long distance(Integer start, Integer end) {
72 return (long) end - start;
73 }
74
75 @Override public Integer minValue() {
76 return Integer.MIN_VALUE;
77 }
78
79 @Override public Integer maxValue() {
80 return Integer.MAX_VALUE;
81 }
82
83 private Object readResolve() {
84 return INSTANCE;
85 }
86
87 @Override
88 public String toString() {
89 return "DiscreteDomain.integers()";
90 }
91
92 private static final long serialVersionUID = 0;
93 }
94
95
96
97
98
99
100 public static DiscreteDomain<Long> longs() {
101 return LongDomain.INSTANCE;
102 }
103
104 private static final class LongDomain extends DiscreteDomain<Long>
105 implements Serializable {
106 private static final LongDomain INSTANCE = new LongDomain();
107
108 @Override public Long next(Long value) {
109 long l = value;
110 return (l == Long.MAX_VALUE) ? null : l + 1;
111 }
112
113 @Override public Long previous(Long value) {
114 long l = value;
115 return (l == Long.MIN_VALUE) ? null : l - 1;
116 }
117
118 @Override public long distance(Long start, Long end) {
119 long result = end - start;
120 if (end > start && result < 0) {
121 return Long.MAX_VALUE;
122 }
123 if (end < start && result > 0) {
124 return Long.MIN_VALUE;
125 }
126 return result;
127 }
128
129 @Override public Long minValue() {
130 return Long.MIN_VALUE;
131 }
132
133 @Override public Long maxValue() {
134 return Long.MAX_VALUE;
135 }
136
137 private Object readResolve() {
138 return INSTANCE;
139 }
140
141 @Override
142 public String toString() {
143 return "DiscreteDomain.longs()";
144 }
145
146 private static final long serialVersionUID = 0;
147 }
148
149
150
151
152
153
154 public static DiscreteDomain<BigInteger> bigIntegers() {
155 return BigIntegerDomain.INSTANCE;
156 }
157
158 private static final class BigIntegerDomain extends DiscreteDomain<BigInteger>
159 implements Serializable {
160 private static final BigIntegerDomain INSTANCE = new BigIntegerDomain();
161
162 private static final BigInteger MIN_LONG =
163 BigInteger.valueOf(Long.MIN_VALUE);
164 private static final BigInteger MAX_LONG =
165 BigInteger.valueOf(Long.MAX_VALUE);
166
167 @Override public BigInteger next(BigInteger value) {
168 return value.add(BigInteger.ONE);
169 }
170
171 @Override public BigInteger previous(BigInteger value) {
172 return value.subtract(BigInteger.ONE);
173 }
174
175 @Override public long distance(BigInteger start, BigInteger end) {
176 return end.subtract(start).max(MIN_LONG).min(MAX_LONG).longValue();
177 }
178
179 private Object readResolve() {
180 return INSTANCE;
181 }
182
183 @Override
184 public String toString() {
185 return "DiscreteDomain.bigIntegers()";
186 }
187
188 private static final long serialVersionUID = 0;
189 }
190
191
192 protected DiscreteDomain() {}
193
194
195
196
197
198
199
200
201
202
203 public abstract C next(C value);
204
205
206
207
208
209
210
211
212
213
214 public abstract C previous(C value);
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231 public abstract long distance(C start, C end);
232
233
234
235
236
237
238
239
240
241
242
243
244 public C minValue() {
245 throw new NoSuchElementException();
246 }
247
248
249
250
251
252
253
254
255
256
257
258
259 public C maxValue() {
260 throw new NoSuchElementException();
261 }
262
263 }